package com.atguigu;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;

import java.io.IOException;
import java.util.List;

/**
 * 秒杀案例
 */
public class SecKill_redis {

	public static void main(String[] args) {
		Jedis jedis =new Jedis("127.0.0.1",6379);
		jedis.auth("123456");
		System.out.println(jedis.ping());
		jedis.close();
	}

	//秒杀过程
	public static boolean doSecKill(String uid,String prodid) throws IOException {
		// 1.uid和prodid非空判断
		if (uid == null || prodid == null) return false;

		// 2.连接redis
		// Jedis jedis = new Jedis("127.0.0.1", 6379);
		// jedis.auth("123456");

		// 通过连接池得到jedis对象
		JedisPool jedisPoolInstance = JedisPoolUtil.getJedisPoolInstance();
		Jedis jedis = jedisPoolInstance.getResource();

		// 3.拼接key
		// 3.1 库存key
		String kcKey = "sk:" + prodid + ":qt";

		// 3.2 秒杀成功用户key
		String userKey = "sk:" + prodid + ":user";

		// 监视库存
		jedis.watch(kcKey);

		// 4.获取库存，如果库存为null，秒杀还没有开始
		String kc = jedis.get(kcKey);
		if (kc == null) {
			System.out.println("秒杀还没有开始，请等待");
			jedis.close();
			return false;
		}

		// 5.判断用户是否重复秒杀操作
		/*
			`sismember <key><value>` 判断集合`<key>`是否为含有该`<value>`值，有1，没有0
		 */
		if (jedis.sismember(userKey, uid)) {
			System.out.println("已经秒杀成功,不能重复秒杀");
			jedis.close();
			return false;
		}

		// 6.判断如果商品数量，库存数量小于1，秒杀结束
		if (Integer.parseInt(kc) <= 0) {
			System.out.println("秒杀已经结束了");
			jedis.close();
			return false;
		}

		// 7.秒杀过程
		// 使用事务
		Transaction multi = jedis.multi();

		// 组队操作
		multi.decr(kcKey);
		multi.sadd(userKey,uid);

		// 执行
		List<Object> results = multi.exec();

		if (null == results || 0 == results.size()) {
			System.out.println("秒杀失败了");
			jedis.close();
			return false;
		}

		// 7.1 库存-1
		jedis.decr(kcKey);
		// 7.2 把秒杀成功的用户添加清单里面
		jedis.sadd(userKey,uid);
		System.out.println("秒杀成功了..");
		jedis.close();
		return true; // 表示秒杀陈宫
	}
}

















